<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category MODEL
   * @package MODELS.
   * @since 05/05/2012.
   * @last_update 05/05/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Application_Model_Cidades extends Zend_Db_Table_Abstract{
    const IND_ATIVO = 1;
    const IND_INATIVO = 0;
    
    /**
     * Define a tabela padrão da controller
     */
    protected function _setup(){
      $this->_name = 'cidades';
      parent::_setup();
    } 
    
    public function getColunas(){
      $arrResult = array();
      $arrCols = $this->fetchAll()->getTable()->_metadata;
      $arrResult[strtoupper($this->_name)] = $arrCols;
      return Core_Commons::onLoad($arrResult);
    }
    
    /**
     * Retorna todos os registros ativos.
     */
    public function getAtivos(){
      $strSql = $this->select()->where($this->_name . '.ds_situacao = ?', self::IND_ATIVO);
      
      $objResult = $this->fetchAll($strSql);
            
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna todos s registro de acordo co mo id
     */
    public function getById($intId){
    	$arrCols = array(
        'c.idCidade',
    	  'c.ds_sigla',
        'c.ds_cidade',
        'c.ds_area',
        'c.idEstado',
        'c.ds_situacao',
        'c.dt_atualizacao',
        'e.ds_estado'
    	);
    	
      $strSql = $this->getAdapter()
      ->select()
      ->from(array('c' => $this->_name), $arrCols)
      ->join(array('e' => 'estados'), 'e.idEstado = c.idEstado', array())
      ->where('c.idCidade = ?', $intId);
      
      $objResult = $this->getAdapter()->fetchRow($strSql);
                      
      return Core_Commons::onLoad($objResult);
    }
    
    public function getByCep($intCep){
      $arrColsCidade     = array('cidades.idCidade', 'cidades.ds_cidade');
    	$arrColsBairro     = array();
    	$arrColsLogradouro = array();
    	
      $strSql = $this->getAdapter()
                     ->select()
                     ->from($this->_name, $arrColsCidade)
                     ->join('bairros', 'bairros.idCidade = ' . $this->_name . '.idCidade', $arrColsBairro)
                     ->join('logradouros', 'logradouros.idBairro = bairros.idBairro', $arrColsLogradouro)
                     ->where('logradouros.ds_cep = ?', $intCep)
                     ->where($this->_name . '.st_cidade = ?', self::IND_ATIVO);
      
      $objResult = $this->getAdapter()->fetchRow($strSql);
            
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna o resultado de acordo com o nome. 
     * 
     * @param string  Nome da Cidade
     * @param string  Sigla do Estado
     * 
     * @return database_result
     */
    public function getByCidadeEEstado($strDsCidade, $strDsSiglaEstado){
      $arrAliasTable = array('c' => $this->_name);
      $arrAliasJoin = array('e' => 'estados');
      
      $arrFromCollumns = array('idCidade', 'ds_cidade', 'ds_situacao');
      
      $arrJoinCollumns = array('ds_sigla');
      
      $strSql = $this->getAdapter()
      ->select()
      ->from($arrAliasTable, $arrFromCollumns)
      ->join($arrAliasJoin, 'e.idEstado = c.idEstado', $arrJoinCollumns)
      ->where('c.ds_situacao = ?', self::IND_ATIVO);
      
      if($strDsCidade && $strDsSiglaEstado)      
        $strSql->where('c.ds_cidade LIKE ?', '%' . $strDsCidade . '%')->where('e.ds_sigla = ?', $strDsSiglaEstado);  
      elseif($strDsCidade && !$strDsSiglaEstado)
        $strSql->where('c.ds_cidade LIKE ?', '%' . $strDsCidade . '%');
      elseif(!$strDsCidade && $strDsSiglaEstado)  
        $strSql->where('e.ds_sigla = ?', $strDsSiglaEstado);    
      else
        $strSql->where('1 = ?', 1);
                 
      $objResult = $this->getAdapter()->fetchAll($strSql);            
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Realiza a validação dos dados vindo do formulário
     * 
     * @return void.
     */
    public function validaForm(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*'  =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Sigla'           =>  array('allowEmpty'  => false, 'fields' => 'ds_sigla'),
        'Cidade'          =>  array('allowEmpty'  => false, 'fields' => 'ds_cidade'),
        'Código de Área'  =>  array('allowEmpty'  => false, 'fields' => 'ds_area'),
        'Estado'          =>  array('allowEmpty'  => false, 'fields' => 'idEstado'),
        'Situação'        =>  array('allowEmpty'  => false, 'fields' => 'ds_situacao'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     * Salva um registro. Funcionalidade para inserção e atualização
     * @param integer Id do registro. Se for diferente de null, então será atualizado o regsitro
     * a partir do id, senão será inserido um novo registro.
     * 
     * @return boolean.
     */
    public function salvar($intId = null){
      $objValida = new Core_ValidaFormulario();
      $objDadosInput = $this->validaForm();
                              
      $arrDados['ds_sigla']       = strtoupper($objDadosInput->ds_sigla);
      $arrDados['ds_cidade']      = ucfirst($objDadosInput->ds_cidade);
      $arrDados['ds_area']        = $objDadosInput->ds_area;
      $arrDados['idEstado']       = $objDadosInput->idEstado;
      $arrDados['ds_situacao']    = $objDadosInput->ds_situacao;
      
      if(!$objValida->validAlpha($objDadosInput->ds_sigla))
        throw new Exception('A sigla deve conter apenas letras!', '3');
      elseif(strlen($objDadosInput->ds_sigla) >= 5)
        throw new Exception('A sigla deve conter até 5 letras!', '3');
      else{
      	if(!$objValida->validNumber($objDadosInput->ds_area))
      	   throw new Exception('O código de área deve conter apenas números!', '3');
      	else{   
	        if($intId == null){
	          $arrDados['dt_insercao']    = date('Y-m-d H:i:s');
	          $arrDados['dt_atualizacao'] = 'NULL';
	          
	          $strSql = $this->select()
	          ->where("ds_sigla = '" . $objDadosInput->ds_sigla . "' OR ds_cidade = '" . $objDadosInput->ds_cidade . "'");
	
	          if($this->fetchAll($strSql)->current())
	            throw new Exception('Cidade já cadastrada com a sigla "' . $objDadosInput->ds_sigla . '" ou com o nome "' . $objDadosInput->ds_cidade . '"!', '3');
	          else
	            return $this->insert($arrDados);
	        }
	        else{ 
	          $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
	      
	          return $this->update($arrDados, 'idCidade = ' . $intId);
	        }
      	}
      }
    }
    
    /**
     * Exclui um registro  a partir do banco de dados.
     * Um registro nunca será ecluido do banco de dados.
     * Considera-se excluído um registro com status igual a "0".
     * 
     * @param integer  id para a clausula where.
     * @return boolean.
     */
    public function excluir($intId){
      $boolReturn = false;
      $objDadosInput = $this->validaForm();
      
      $strWhere = "idCidade = '" . $intId . "'";
      $arrDados['ds_situacao'] = self::IND_INATIVO; 
      $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
            
      if($this->update($arrDados, $strWhere))  
        $boolReturn = true;
      
      return $boolReturn; 
      
    }
    
    public function getByEstado($intIdEstado){
    	$strSql = $this->select()->where('idEstado = ?', $intIdEstado);
    	
    	return $this->fetchAll($strSql)->toArray();
    }
  }